package pe.edu.upc.dsd.epica.web;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.soap.SOAPException;

import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.apache.log4j.Logger;
import org.springframework.web.context.support.WebApplicationContextUtils;
import pe.edu.upc.dsd.epica.model.Establecimiento;
import pe.edu.upc.dsd.epica.model.ListaPromocion;
import pe.edu.upc.dsd.epica.model.Promocion;
import pe.edu.upc.dsd.epica.model.PromocionxUsuario;
import pe.edu.upc.dsd.epica.model.Usuario;
import pe.edu.upc.dsd.epica.service.PromocionService;
import pe.edu.upc.dsd.epica.service.PromocionxUsuarioService;
import pe.edu.upc.dsd.epica.util.Session;
import pe.edu.upc.dsd.epica.util.UrlBuilder;

public class CheckInServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private final static Logger logger = Logger.getLogger(CheckInServlet.class);
	private PromocionxUsuarioService promocionxUsuarioServiceWs;
	private PromocionService promocionServiceRest ;
	
	@Override
    public void init(ServletConfig config) throws ServletException {

            this.promocionxUsuarioServiceWs = 
            		WebApplicationContextUtils.getWebApplicationContext(
            				config.getServletContext()).getBean("promocionxUsuarioServiceClient", 
            						PromocionxUsuarioService.class);
            UrlBuilder builder=WebApplicationContextUtils
    				.getWebApplicationContext(config.getServletContext()).getBean(
    						"urlBuilder",
    						UrlBuilder.class);
            
            this.promocionServiceRest = JAXRSClientFactory.create(
    				builder.getUrlServicio(),
    				PromocionService.class);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		Establecimiento establecimiento = Session.ObtenerValor(req.getSession());
	
		if(establecimiento == null)
		{
			req.getRequestDispatcher("CerrarSesion").forward(req, resp);
			return;
		}
		
		String codigoEstablecimiento = establecimiento.getCodigo();

		ListaPromocion promociones = null;
		try {
			promociones = promocionServiceRest
					.findByEstablecimientoCode(codigoEstablecimiento);
		} catch (SOAPException e) {
			logger.error("Titulo:\nBuscar Promocion por codigo [PromocionService].\nMensaje:\n"+e.getMessage());
		}

		req.setAttribute("promos", promociones.getListaPromociones());

		req.getRequestDispatcher("checkin.jsp").forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub

		Establecimiento establecimiento = Session.ObtenerValor(req.getSession());
		
		if(establecimiento == null)
		{
			req.getRequestDispatcher("CerrarSesion").forward(req, resp);
			return;
		}
		
		PromocionxUsuario usuarioPromocion = new PromocionxUsuario();
		Promocion prom = new Promocion();
		Usuario usu = new Usuario();

		prom.setCodigo(req.getParameter("codigoPromo"));
		usu.setLogin(req.getParameter("login"));
		usu.setTipo(req.getParameter("tipo"));

		usuarioPromocion.setPromocion(prom);
		usuarioPromocion.setUsuario(usu);

		PromocionxUsuario respuestaPromUsu = null;
		
		try {
			respuestaPromUsu = promocionxUsuarioServiceWs.addVisita(usuarioPromocion);
		} catch (Exception e) {
			// TODO: handle exception
			req.setAttribute("error", e.getMessage());
			
			String codigoEstablecimiento = establecimiento.getCodigo();

			ListaPromocion promociones = null;
			try {
				promociones = promocionServiceRest
						.findByEstablecimientoCode(codigoEstablecimiento);
			} catch (SOAPException e1) {
				logger.error("Titulo:\nBuscar Promocion por codigo establecimiento [PromocionService].\nMensaje:\n"+e1.getMessage());
			}

			req.setAttribute("promos", promociones.getListaPromociones());
			
			req.getRequestDispatcher("checkin.jsp").forward(req, resp);
			
			logger.error("Titulo:\nRegistrar Visita [PromocionxUsuarioService].\nMensaje:\n"+e.getMessage());
			
			return;
		}		
		
		req.setAttribute("respPromUsu", respuestaPromUsu);
		req.getRequestDispatcher("checkinSummary.jsp").forward(req, resp);
	}

	
}
